<?php
/**
 * Description of Abstract
 *
 * @author Gowork
 */
abstract class App_Mapper_Abstract {
    
    /**
     * Objekt Zend_Db_Table_
     * @var object 
     */
    protected $_dbTable = null;
    
    /**
     *
     * @var string Nazwa modelu dostępu do tabeli 
     */
    protected $_dbTableClass = null;
    
    /**
     * Ogranicz wyniki do zbioru danego rodzica
     * @var int  
     */
    protected $_idParent = null;

    public function setDbTable($dbTable)
    {
        if (is_string($dbTable)) {
            $dbTable = new $dbTable();
        }
        if (!$dbTable instanceof Zend_Db_Table_Abstract) {
            throw new Exception('Invalid table data gateway provided');
        }
        $this->_dbTable = $dbTable;
        return $this;
    }
    
    /**
     * 
     * @return Zend_Db_Table_Abstract
     */
    public function getDbTable()
    {
        if (null === $this->_dbTable) {
            $this->setDbTable($this->_dbTableClass);
        }
        return $this->_dbTable;
    }
            
    /**
     * Nakłada ograniczenia w dostępie do zasobów
     * @param int|array $idParent
     * @return \App_Mapper_Abstract
     */
    public function setParentId($idParent = null) {
        
        if(is_array($idParent)) {
            $this->_idParent = (array)$idParent;
        } elseif( (int)$idParent > 0 ) {
            $this->_idParent = (int)$idParent;
        }
        return $this;
    }
    
    /**
     * Sprawdza czy zostało nałożone ograniczenie w dostępie do wierszy, jeśli tak to tworzy 
     * klauzule where o danym id lub zbiorze id
     * @param Zend_Db_Table_Select $select
     * @param string $fieldName
     * @return Zend_Db_Table_Select
     */
    public function checkPrivileges(&$select,$fieldName) {
        
        if(is_array($this->_idParent)) {
            $select->where($fieldName.' IN (?)',$this->_idParent);
        } elseif ((int)$this->_idParent > 0) {
            $select->where($fieldName.' = ?',$this->_idParent);
        }
        
        return $select;
        
    }
    
    /**
     * Metoda zwraca czysty select
     * @return \Zend_Db_Select
     */
    public function getDbSelect() {
        return new Zend_Db_Select(Zend_Db_Table::getDefaultAdapter());
    }
    
    /**
     * Metoda zwraca Zend_Db_Table_Select służący do konstrukcji zapytań,
     * Metoda pownna zwracać fragment SQL:
     * Select * from {tableAllias}.{tableName}
     * @return Zend_Db_Table_Select $this->getDbTable()
     *                                   ->setIntegrityCheck(false)
     *                                   ->select()
     *                                   ->from(array('tableAllias'=>'tableName'))
     */
    abstract protected function getDbTableSelect();
    
}
?>
